/*
 * @Author: 0x9DEFA478
 * @Date: 2021-12-17 21:40:46
 * @LastEditTime: 2022-06-20 00:46:29
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "IP_SPI.h"




int IP_SPI_MasterFullDuplex_IsBusy(void* v);
int IP_SPI_MasterOnlyTx_IsBusy(void* v);




static void SetSCK_DIV(IP_SPI* ip_spi,unsigned int SCK_DIV);




static void Get_SCK_DIV_BitWidth(IP_SPI* ip_spi){

  //获取当前分频
  ip_spi->SCK_DIV=(cIP_SPI_SPI(ip_spi)->CFG1&SPI_CFG1_MBR_Msk)>>SPI_CFG1_MBR_Pos;

  //获取当前位宽
  ip_spi->BitWidth=((cIP_SPI_SPI(ip_spi)->CFG1&SPI_CFG1_DSIZE_Msk)>>SPI_CFG1_DSIZE_Pos)+1U;
  
}




/**
 * @brief 为全双工模式进行初始化
 * @param ip_spi 新的IP_SPI
 * @param DMA_Tx 发送DMA
 * @param DMA_Rx 接收DMA
 * @param _spi spi句柄
 * @return 无
 */
void IP_SPI_MasterFullDuplex_Init(IP_SPI* ip_spi,IP_DMA* DMA_Tx,IP_DMA* DMA_Rx,SPI_TypeDef* _spi){

  cIP_SPI_SPI(ip_spi)=_spi;//实例传入
  ip_spi->Instance.DMA_Tx=DMA_Tx;
  ip_spi->Instance.DMA_Rx=DMA_Rx;

  cIP_SPI_txDMA(ip_spi)->PAR=(unsigned int)&cIP_SPI_SPI(ip_spi)->TXDR;
  cIP_SPI_rxDMA(ip_spi)->PAR=(unsigned int)&cIP_SPI_SPI(ip_spi)->RXDR;

  cIP_SPI_SPI(ip_spi)->CFG1|=SPI_CFG1_TXDMAEN;//使能spi的tx dma请求
  cIP_SPI_SPI(ip_spi)->CFG1|=SPI_CFG1_RXDMAEN;//使能spi的rx dma请求

  Get_SCK_DIV_BitWidth(ip_spi);

  ip_spi->Mode.Master.Busy=0;
  ip_spi->Mode.Master.IsBusy=IP_SPI_MasterFullDuplex_IsBusy;

  cIP_SPI_SPI(ip_spi)->CR2=0U;//设置长度 0:不停止传输
  cIP_SPI_SPI(ip_spi)->CR1|=SPI_CR1_SPE;//使能SPI
  cIP_SPI_SPI(ip_spi)->CR1|=SPI_CR1_CSTART;//开始传输

}

/**
 * @brief 为仅发送模式进行初始化
 * @param ip_spi 新的IP_SPI
 * @param DMA_Tx 发送DMA
 * @param _spi spi句柄
 * @return 无
 */
void IP_SPI_MasterOnlyTx_Init(IP_SPI* ip_spi,IP_DMA* DMA_Tx,SPI_TypeDef* _spi){

  cIP_SPI_SPI(ip_spi)=_spi;//实例传入
  ip_spi->Instance.DMA_Tx=DMA_Tx;
  ip_spi->Instance.DMA_Rx=NULL;
  
  cIP_SPI_txDMA(ip_spi)->PAR=(unsigned int)&cIP_SPI_SPI(ip_spi)->TXDR;

  cIP_SPI_SPI(ip_spi)->CFG1|=SPI_CFG1_TXDMAEN;//使能SPI的Tx DMA请求

  Get_SCK_DIV_BitWidth(ip_spi);

  ip_spi->Mode.Master.Busy=0;
  ip_spi->Mode.Master.IsBusy=IP_SPI_MasterOnlyTx_IsBusy;

  cIP_SPI_SPI(ip_spi)->CR2=0U;//设置长度 0:不停止传输
  cIP_SPI_SPI(ip_spi)->CR1|=SPI_CR1_SPE;//使能SPI
  cIP_SPI_SPI(ip_spi)->CR1|=SPI_CR1_CSTART;//开始传输

}

/**
 * @brief 设置SCK时钟分频
 *        在SPI空闲时才能调用
 * @param ip_spi IP_SPI对象
 * @param SCK_DIV SCK时钟分频 0U~7U 对应2~256分频
 * @return 无
 */
void IP_SPI_Master_SetSCK_DIV(IP_SPI* ip_spi,unsigned int SCK_DIV){

  SetSCK_DIV(ip_spi,SCK_DIV);
}




static void SetSCK_DIV(IP_SPI* ip_spi,unsigned int SCK_DIV){
  unsigned int CR1;

  if(SCK_DIV>7U){
    SCK_DIV=7;
  }

  if(ip_spi->SCK_DIV==SCK_DIV){
    //无需修改
    return;
  }
  ip_spi->SCK_DIV=SCK_DIV;
  
  SCK_DIV=(SCK_DIV<<SPI_CFG1_MBR_Pos)&SPI_CFG1_MBR_Msk;


  CR1=cIP_SPI_SPI(ip_spi)->CR1;

  //失能SPI
  cIP_SPI_SPI(ip_spi)->CR1=CR1&(~SPI_CR1_SPE);

  //设置MBR
  cIP_SPI_SPI(ip_spi)->CFG1=(cIP_SPI_SPI(ip_spi)->CFG1&(~SPI_CFG1_MBR_Msk))|SCK_DIV;

  //使能SPI
  CR1|=SPI_CR1_SPE;
  cIP_SPI_SPI(ip_spi)->CR1=CR1;

  //启动传输
  CR1|=SPI_CR1_CSTART;
  cIP_SPI_SPI(ip_spi)->CR1=CR1;

}



